# -*- coding: utf-8 -*-
# Author   : ZhangQing
# Time     : 2025-08-04 23:37
# File     : code_templates.py
# Project  : codebuddy_craft
# Desc     : 代码模板

import os
import json
from typing import Dict, List, Optional, Any

class CodeTemplateManager:
    """代码模板管理器
    
    负责加载、管理和提供各种编程语言和框架的代码模板
    """
    
    def __init__(self, templates_dir: Optional[str] = None):
        """初始化代码模板管理器
        
        Args:
            templates_dir: 模板目录路径，默认为None，将使用默认路径
        """
        self.templates_dir = templates_dir or os.path.join(
            os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
            "resources", "templates"
        )
        self.templates: Dict[str, Dict[str, Any]] = {}
        self._load_templates()
    
    def _load_templates(self) -> None:
        """加载所有模板文件"""
        if not os.path.exists(self.templates_dir):
            os.makedirs(self.templates_dir, exist_ok=True)
            
        # 遍历模板目录加载所有JSON模板文件
        for root, _, files in os.walk(self.templates_dir):
            for file in files:
                if file.endswith('.json'):
                    try:
                        file_path = os.path.join(root, file)
                        relative_path = os.path.relpath(file_path, self.templates_dir)
                        tech_stack = os.path.splitext(relative_path)[0].replace(os.path.sep, '.')
                        
                        with open(file_path, 'r', encoding='utf-8') as f:
                            template_data = json.load(f)
                            self.templates[tech_stack] = template_data
                    except Exception as e:
                        print(f"Error loading template {file}: {str(e)}")
    
    def get_template(self, tech_stack: str) -> Dict[str, Any]:
        """获取指定技术栈的模板
        
        Args:
            tech_stack: 技术栈名称，如 'python.fastapi', 'javascript.react'
            
        Returns:
            包含模板信息的字典
        """
        # 尝试精确匹配
        if tech_stack in self.templates:
            return self.templates[tech_stack]
        
        # 尝试部分匹配
        for template_name in self.templates:
            if tech_stack.lower() in template_name.lower():
                return self.templates[template_name]
        
        # 返回默认模板
        return self._get_default_template()
    
    def _get_default_template(self) -> Dict[str, Any]:
        """获取默认模板
        
        Returns:
            默认模板字典
        """
        return {
            "name": "generic",
            "description": "通用代码模板",
            "file_structure": [],
            "snippets": {
                "hello_world": "print('Hello, World!')"
            }
        }
    
    def get_available_tech_stacks(self) -> List[str]:
        """获取所有可用的技术栈列表
        
        Returns:
            技术栈名称列表
        """
        return list(self.templates.keys())